package com.hu._02_work_queue;

import com.hu.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

//消息接受者
public class Rev {

    public static void main(String[] args) throws Exception {
        /*
         * 消费者前三步 获取连接对象 创建通道 创建队列 和发送者一摸一样
         * */
        //通过连接工具创建链接对象
        Connection connection = ConnectionUtil.getConnection();

        //连接对象 创建通道
        Channel channel = connection.createChannel();

        /** 创建队列
         *  参数：
         *  队列名，持久化，独占链接，队列用完删除，扩展参数
         */
        channel.queueDeclare(Send.NAME_QUEUE_WORKQUEUE,true,false,false,null);

        //同时处理一个消息（能者多劳；现在来了一个消息，一个人还没做完，而另一个有空闲的就去做   注意两个都要配置！）
        channel.basicQos(1);

        //消息回调（接收发送者的消息,即：对消息的处理）    作为队列消费消息的第三个参数（  channel.basicConsume();  ）
        //Consumer是一个接口，不需要那么多方法，所以找的已有的子类DefaultConsumer（需要一个通道参数） 直接复写要的方法handleDelivery
        Consumer consumer = new  DefaultConsumer(channel) {
            /**
             * handleDelivery方法
             *
             * 消费者接收消息调用此方法（处理消息）
             * @param consumerTag 消费者的标签，在channel.basicConsume()去指定
             * @param envelope 消息包的内容，可从中获取消息id，消息routingkey，交换机，消息和重传标志
            (收到消息失败后是否需要重新发送)
             * @param properties
             * @param body 消息内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //int  i = 1 / 0 ;    //模拟消息消费中断
                try {
                    Thread.sleep(33333333);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("消费者的ID："+consumerTag);
                System.out.println("消息的ID："+envelope.getDeliveryTag());
                System.out.println("交换机："+envelope.getExchange());
                System.out.println("队列："+envelope.getRoutingKey());
                System.out.println("收到消息："+new String(body));
                System.out.println("消息消费成功=================================");
                //手动签收消息
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        //6.接收并消费消息 : 队列名， 签收模式(true自动签收，false手动签收) ，回调
        channel.basicConsume(Send.NAME_QUEUE_WORKQUEUE,false,consumer);
    }
}